home *** CD-ROM | disk | FTP | other *** search
/ Java Primer Plus / Java Primer Plus (Waite Group Proess)(1996).iso / java_Win / demo / ImageMap / RoundButtonFilter.class (.txt) < prev    next >
Encoding:
Java Class File  |  1995-10-12  |  2.5 KB  |  131 lines

  1. class RoundButtonFilter extends ButtonFilter {
  2.    int Xcenter;
  3.    int Ycenter;
  4.    int Yradsq;
  5.    int innerW;
  6.    int innerH;
  7.    int Yrad2sq;
  8.    private int[] savedranges;
  9.    private int savedy;
  10.  
  11.    public RoundButtonFilter(boolean press, int p, int b, int w, int h) {
  12.       super(press, p, b, w, h);
  13.       this.Xcenter = w / 2;
  14.       this.Ycenter = h / 2;
  15.       this.Yradsq = h * h / 4;
  16.       this.innerW = w - super.border * 2;
  17.       this.innerH = h - super.border * 2;
  18.       this.Yrad2sq = this.innerH * this.innerH / 4;
  19.    }
  20.  
  21.    public void buttonRanges(int y, int[] ranges) {
  22.       int yrel = Math.abs(this.Ycenter - y);
  23.       int xrel = (int)(Math.sqrt((double)(this.Yradsq - yrel * yrel)) * (double)super.width / (double)super.height);
  24.       ranges[0] = 0;
  25.       ranges[1] = this.Xcenter - xrel;
  26.       ranges[6] = this.Xcenter + xrel;
  27.       ranges[7] = super.width;
  28.       if (y < super.border) {
  29.          ranges[2] = ranges[3] = ranges[4] = this.Xcenter;
  30.          ranges[5] = ranges[6];
  31.       } else if (y + super.border >= super.height) {
  32.          ranges[2] = ranges[1];
  33.          ranges[3] = ranges[4] = ranges[5] = this.Xcenter;
  34.       } else {
  35.          int xrel2 = (int)(Math.sqrt((double)(this.Yrad2sq - yrel * yrel)) * (double)this.innerW / (double)this.innerH);
  36.          ranges[3] = this.Xcenter - xrel2;
  37.          ranges[4] = this.Xcenter + xrel2;
  38.          if (y < this.Ycenter) {
  39.             ranges[2] = ranges[3];
  40.             ranges[5] = ranges[6];
  41.          } else {
  42.             ranges[2] = ranges[1];
  43.             ranges[5] = ranges[4];
  44.          }
  45.       }
  46.    }
  47.  
  48.    private synchronized int[] getRanges(int y) {
  49.       if (this.savedranges == null || this.savedy != y) {
  50.          if (this.savedranges == null) {
  51.             this.savedranges = new int[8];
  52.          }
  53.  
  54.          this.buttonRanges(y, this.savedranges);
  55.          this.savedy = y;
  56.       }
  57.  
  58.       return this.savedranges;
  59.    }
  60.  
  61.    public int filterRGB(int x, int y, int rgb) {
  62.       int[] ranges = this.getRanges(y);
  63.  
  64.       int i;
  65.       for(i = 0; i < 7 && (x < ranges[i] || x >= ranges[i + 1]); ++i) {
  66.       }
  67.  
  68.       boolean brighter;
  69.       int percent;
  70.       switch (i) {
  71.          case 0:
  72.          case 6:
  73.          default:
  74.             return rgb & 16777215;
  75.          case 1:
  76.             brighter = !super.pressed;
  77.             percent = super.defpercent;
  78.             break;
  79.          case 2:
  80.             double angle = Math.atan2((double)(y - this.Ycenter), (double)(this.Xcenter - x));
  81.             percent = super.defpercent - (int)(Math.cos(angle) * (double)2.0F * (double)super.defpercent);
  82.             if (!super.pressed) {
  83.                percent = -percent;
  84.             }
  85.  
  86.             if (percent == 0) {
  87.                return rgb;
  88.             }
  89.  
  90.             if (percent < 0) {
  91.                percent = -percent;
  92.                brighter = false;
  93.             } else {
  94.                brighter = true;
  95.             }
  96.             break;
  97.          case 3:
  98.             if (!super.pressed) {
  99.                return rgb & 16777215;
  100.             }
  101.  
  102.             brighter = false;
  103.             percent = super.defpercent;
  104.             break;
  105.          case 4:
  106.             double angle = Math.atan2((double)(this.Ycenter - y), (double)(x - this.Xcenter));
  107.             percent = super.defpercent - (int)(Math.cos(angle) * (double)2.0F * (double)super.defpercent);
  108.             if (super.pressed) {
  109.                percent = -percent;
  110.             }
  111.  
  112.             if (percent == 0) {
  113.                return rgb;
  114.             }
  115.  
  116.             if (percent < 0) {
  117.                percent = -percent;
  118.                brighter = false;
  119.             } else {
  120.                brighter = true;
  121.             }
  122.             break;
  123.          case 5:
  124.             brighter = super.pressed;
  125.             percent = super.defpercent;
  126.       }
  127.  
  128.       return ((ButtonFilter)this).filterRGB(rgb, brighter, percent);
  129.    }
  130. }
  131.